/**
 * 菜单过滤工具类
 * 支持多种过滤策略
 */
class MenuFilter {
    /**
     * 根据策略名称获取过滤器实例
     * @param {string} strategy - 策略名称：'recursive' | 'twoLevel'
     * @returns {Object} 过滤器实例
     */
    static use(strategy = 'recursive') {
        const strategies = {
            recursive: new RecursiveFilter(),
            twoLevel: new TwoLevelFilter()
        };

        const filter = strategies[strategy];
        if (!filter) {
            console.warn(`[MenuFilter] 未知策略: ${strategy}，使用默认 recursive`);
            return strategies.recursive;
        }
        return filter;
    }
}

// ========================================
// 策略1：递归方式（适合任意层级）
// ========================================
class RecursiveFilter {
    filter(menus, allowedIds) {
        const allowedSet = new Set(allowedIds);

        function isVisible(menu) {
            // 如果自己有权限，可见
            if (allowedSet.has(menu.id)) {
                return true;
            }
            // 如果子菜单有可见的，也可见（作为目录）
            if (menu.children && menu.children.length > 0) {
                return menu.children.some(isVisible);
            }
            return false;
        }

        function buildTree(menu) {
            if (!isVisible(menu)) return null;

            const result = { ...menu };

            if (menu.children && menu.children.length > 0) {
                result.children = menu.children
                    .map(buildTree)
                    .filter(Boolean);
            } else {
                result.children = [];
            }

            // 如果自己没权限但子菜单有权限，置灰
            if (!allowedSet.has(menu.id) && result.children.length > 0) {
                result.disabled = true;
            }

            return result;
        }

        return menus.map(buildTree).filter(Boolean);
    }
}

// ========================================
// 策略2：两层菜单循环方式
// ========================================
class TwoLevelFilter {
    filter(allMenus, allowedIds) {
        const result = [];
        const allowedSet = new Set(allowedIds); // 提升性能

        for (let i = 0; i < allMenus.length; i++) {
            const dir = allMenus[i];
            const dirCopy = {
                ...dir,
                children: [],
                disabled: true // 默认置灰
            };

            let hasVisibleChild = false;

            if (dir.children && Array.isArray(dir.children)) {
                for (let j = 0; j < dir.children.length; j++) {
                    const menu = dir.children[j];
                    if (allowedSet.has(menu.id)) {
                        dirCopy.children.push(menu);
                        hasVisibleChild = true;
                    }
                }
            }

            // 如果有子菜单可见，保留该目录
            if (hasVisibleChild) {
                // 如果目录自己也有权限，就可点击
                if (allowedSet.has(dir.id)) {
                    dirCopy.disabled = false;
                }
                result.push(dirCopy);
            }
        }

        return result;
    }
}
// 命名导出 使用时：import { MenuFilter } from '@/utils/menuFilter';
export { MenuFilter };

// 默认导出 使用时：import MenuFilter from '@/utils/menuFilter';
// export default MenuFilter;